package cn.iocoder.yudao.module.system.controller.admin.examscore.vo;

import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;

/**
 * 学生成绩 Base VO，提供给添加、修改、详细的子 VO 使用
 * 如果子 VO 存在差异的字段，请不要添加到这里，影响 Swagger 文档生成
 */
@Data
public class ExamScoreBaseVO {

    @Schema(description = "考试ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "考试ID不能为空")
    @ExcelProperty("考试ID")
    private Long examId;

    @Schema(description = "学生ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "学生ID不能为空")
    @ExcelProperty("学生ID")
    private Long studentId;

    @Schema(description = "学号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024001")
    @NotBlank(message = "学号不能为空")
    @Size(max = 50, message = "学号长度不能超过50个字符")
    @ExcelProperty("学号")
    private String studentNo;

    @Schema(description = "学生姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
    @NotBlank(message = "学生姓名不能为空")
    @Size(max = 100, message = "学生姓名长度不能超过100个字符")
    @ExcelProperty("学生姓名")
    private String studentName;

    @Schema(description = "语文成绩", example = "120.5")
    @ExcelProperty("语文成绩")
    private BigDecimal chineseScore;

    @Schema(description = "数学成绩", example = "135.0")
    @ExcelProperty("数学成绩")
    private BigDecimal mathScore;

    @Schema(description = "英语成绩", example = "128.5")
    @ExcelProperty("英语成绩")
    private BigDecimal englishScore;

    @Schema(description = "物理成绩", example = "85.0")
    @ExcelProperty("物理成绩")
    private BigDecimal physicsScore;

    @Schema(description = "化学成绩", example = "78.5")
    @ExcelProperty("化学成绩")
    private BigDecimal chemistryScore;

    @Schema(description = "生物成绩", example = "82.0")
    @ExcelProperty("生物成绩")
    private BigDecimal biologyScore;

    @Schema(description = "政治成绩", example = "88.5")
    @ExcelProperty("政治成绩")
    private BigDecimal politicsScore;

    @Schema(description = "历史成绩", example = "90.0")
    @ExcelProperty("历史成绩")
    private BigDecimal historyScore;

    @Schema(description = "地理成绩", example = "85.5")
    @ExcelProperty("地理成绩")
    private BigDecimal geographyScore;

    // ========== 小语种成绩 ==========

    @Schema(description = "俄语原始分", example = "128.0")
    @ExcelProperty("俄语原始分")
    private BigDecimal russianOriginalScore;

    @Schema(description = "俄语赋分", example = "130.5")
    @ExcelProperty("俄语赋分")
    private BigDecimal russianAssignedScore;

    @Schema(description = "俄语赋分等级", example = "A")
    @ExcelProperty("俄语赋分等级")
    private String russianGradeLevel;

    @Schema(description = "俄语联考排名", example = "50")
    @ExcelProperty("俄语联考排名")
    private Integer russianUnionRank;

    @Schema(description = "俄语校内排名", example = "15")
    @ExcelProperty("俄语校内排名")
    private Integer russianSchoolRank;

    @Schema(description = "俄语班级排名", example = "3")
    @ExcelProperty("俄语班级排名")
    private Integer russianClassRank;

    @Schema(description = "日语原始分", example = "135.0")
    @ExcelProperty("日语原始分")
    private BigDecimal japaneseOriginalScore;

    @Schema(description = "日语赋分", example = "137.5")
    @ExcelProperty("日语赋分")
    private BigDecimal japaneseAssignedScore;

    @Schema(description = "日语赋分等级", example = "A+")
    @ExcelProperty("日语赋分等级")
    private String japaneseGradeLevel;

    @Schema(description = "日语联考排名", example = "25")
    @ExcelProperty("日语联考排名")
    private Integer japaneseUnionRank;

    @Schema(description = "日语校内排名", example = "8")
    @ExcelProperty("日语校内排名")
    private Integer japaneseSchoolRank;

    @Schema(description = "日语班级排名", example = "2")
    @ExcelProperty("日语班级排名")
    private Integer japaneseClassRank;

    @Schema(description = "西班牙语原始分", example = "125.0")
    @ExcelProperty("西班牙语原始分")
    private BigDecimal spanishOriginalScore;

    @Schema(description = "西班牙语赋分", example = "127.5")
    @ExcelProperty("西班牙语赋分")
    private BigDecimal spanishAssignedScore;

    @Schema(description = "西班牙语赋分等级", example = "B+")
    @ExcelProperty("西班牙语赋分等级")
    private String spanishGradeLevel;

    @Schema(description = "西班牙语联考排名", example = "60")
    @ExcelProperty("西班牙语联考排名")
    private Integer spanishUnionRank;

    @Schema(description = "西班牙语校内排名", example = "20")
    @ExcelProperty("西班牙语校内排名")
    private Integer spanishSchoolRank;

    @Schema(description = "西班牙语班级排名", example = "5")
    @ExcelProperty("西班牙语班级排名")
    private Integer spanishClassRank;

    @Schema(description = "总分", requiredMode = Schema.RequiredMode.REQUIRED, example = "650.5")
    @NotNull(message = "总分不能为空")
    @ExcelProperty("总分")
    private BigDecimal totalScore;

    @Schema(description = "班级排名", example = "5")
    @ExcelProperty("班级排名")
    private Integer classRank;

    @Schema(description = "年级排名", example = "25")
    @ExcelProperty("年级排名")
    private Integer gradeRank;

    @Schema(description = "学生所在省份", example = "广东省")
    @ExcelProperty("学生所在省份")
    private String province;

    @Schema(description = "首选科目", example = "物理")
    @ExcelProperty("首选科目")
    private String firstSubject;

    @Schema(description = "次选科目", example = "化学,生物")
    @ExcelProperty("次选科目")
    private String secondSubject;

    @Schema(description = "考试类型", example = "物理类")
    @ExcelProperty("考试类型")
    private String examType;

    @Schema(description = "考号", example = "202400001")
    @ExcelProperty("考号")
    private String examNo;

    @Schema(description = "班级ID", example = "1")
    @ExcelProperty("班级ID")
    private Long classId;

    @Schema(description = "选科组合", example = "物理+化学+生物")
    @ExcelProperty("选科组合")
    private String subjectCombination;

    @Schema(description = "总分赋分", example = "650.5")
    @ExcelProperty("总分赋分")
    private BigDecimal totalScoreAssigned;

    @Schema(description = "组合排名", example = "15")
    @ExcelProperty("组合排名")
    private Integer combinationRank;

    @Schema(description = "校内排名", example = "35")
    @ExcelProperty("校内排名")
    private Integer schoolRank;

}